home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tiger Disk 6
/
Tiger_Disk_006_19xx_Tiger-Crew-Disk_de_Side_B.d64
/
12 mk
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2023-02-26
|
7KB
|
176 lines
8 clr
10 u$="[197][197][197][197][197][197][197][197][197][197]":o$="[164][164][164][164][164][164][164][164][164]":i$="input-routine":b$=" bildschirm"
101 data169,255,133,1,169,3,133,2,160,0,230,1,208,4,230,2,48
102 data14,177,1,208,244,200,177,1,208,237,200,177,1,208,232,96
200 print"[147][164][164][164]";o$;o$;o$;o$:print"syntax-lehrgang 'maschinensprache' (12)
210 [153]"tototototototo";o$:[153]"3. suchroutinen "
220 [153]"ein gleichermassen wichtiges wie haeu-
230 print"figes problem stellen die suchroutinen
240 [153]"dar. wir lernen in dieser lektion, wie
250 print"suchroutinen aufgebaut sind.
260 [153]"der vorteil von suchroutinen, die in
270 print"maschinensprache geschrieben sind, ist
280 [153]"ihre um ein vielfaches (ca faktor 1000)
290 print"hoehere geschwindigkeit.
300 [140]:[129]i[178]0[164]32:[135]x:[151]826[170]i,x:[130]
310 i[178]1:[141]5000:[139]fl[167]200
400 [153]"loadwir werden den prinzipiellen aufbau von
410 print"suchroutinen an einer einfachen such-
420 [153]"routine studieren.
430 print"wir wollen den bereich $0400 bis $8000
440 [153]"nach der bytefolge '$00-$00-$00' durch-
450 print"suchen.wir suchen also die adresse des-
460 [153]"jenigen speichers, dessen inhalt und
470 print"gleichzeitig auch der inhalt der beiden
480 [153]"folgenden speicher gleich null ist.
490 print"diese adresse ist die endadresse des
500 [153]"gerade im ram stehenden basicprogramms.
520 i=2:gosub5000:ifflthen200
600 print"[147]wir benoetigen einen zaehler, der von
605 [153]"$0400 bis $8000 zaehlen kann.der inhalt
606 print"des speichers, dessen adresse dieser
610 [153]"zaehler angibt, wird auf den wert $00
615 print"geprueft. ist der inhalt ungleich $00,
620 [153]"so wird der zaehler um eins erhoeht.ist
630 print"er gleich $00,so werden auch die beiden
640 [153]"folgenden speicher auf $00 geprueft.
650 print"sind sie nicht beide null, so wird wei-
660 [153]"tergesucht, andernfalls wird die suche
670 print"abgebrochen. maximal soll bis $8000 ge-
680 [153]"sucht werden.
720 i=3:gosub5000:ifflthen400
800 print"[147]als zaehler verwenden wir die speicher
805 [153]"$01/$02. es muessen 2 speicher sein, da
810 print"die adressen 2 byte umfassen. wir waeh-
815 [153]"len zeropage-speicher, da diese erstens
820 print"schneller ansprechbar sind und zweitens
830 [153]"indirekt indiziert werden koennen.
930 i=4:gosub5000:ifflthen600
1000 print"[147]zuerst laden wir die startadresse minus
1010 [153]"1 in diese beiden speicher.dabei beach-
1020 print"ten wir die reihenfolge niederwertig/
1030 [153]"hoeherwertig (low/high):
1040 print" lda #$ff
1050 [153]" sta $01 $ff nach $01
1060 print" lda #$03
1070 [153]" sta $02 $03 nach $02
1080 print"da wir indirekt indiziert adressieren
1090 [153]"wollen, laden wir das yr mit $00:
1100 print" ldy #$00
1130 i[178]5:[141]5000:[139]fl[167]800
1200 [153]"loadwir beginnen nun die suchschleife mit
1210 print"dem erhoehen der adresse in speicher
1220 [153]"$01/$02 um 1:
1230 print" inc $01 erhoehen des low-bytes
1240 [153]" or_bne $04 = 0 ?
1250 print" [221][157][221] inc $02 erhoehen des high-bytes
1260 [153]" (NULL)cmd(NULL) bmi $.. = $80 ?
1270 print" [221][157][173][192]....
1275 [153]"wegen bne wird $02 nur beim auftreten
1280 print"eines ueberlaufs um 1 erhoeht.
1290 [153]"mit bmi springt man bei erreichen von
1300 print"$8000 an eine stelle, wo rts steht.
1320 i[178]6:[141]5000:[139]fl[167]1000
1400 [153]"loadnun erfolgt die abfrage, ob der inhalt
1410 print"des speichers, dessen adresse in $01/02
1420 [153]"steht, gleich null ist. falls nein, er-
1430 print"folgt der sprung zu der stelle, wo die
1440 [153]"adresse in $01/02 inkrementiert wird.
1450 print" lda ($01),y beachte: y=0!
1460 [153]" bne $.. sprung zu 'inc $01'
1530 i=7:gosub5000:ifflthen1200
1600 print"[147]falls ja, gehts weiter mit dem nachfol-
1610 [153]"genden speicher:
1620 print" iny jetzt: y=1
1630 [153]" lda ($01),y
1640 print" bne $.. sprung zu 'ldy #$00'
1650 [153]"falls auch dieser null ist, wird auch
1655 print"noch der dritte speicher geprueft:
1660 [153]" iny jetzt: y=2
1670 print" lda ($01),y
1680 [153]" bne $.. sprung zu 'ldy #$00'
1690 print"und falls auch der null ist,erfolgt der
1700 [153]" rts ruecksprung zu basic
1710 i=8:gosub5000:ifflthen1400
1800 print"[147]nun noch mal alles zusammen:
1805 [153]" lda #$ff startadr = 03ff
1810 print" sta $01
1815 [153]" lda #$03
1820 print" sta $02
1825 [153]" ortantantanldy #$00 y, start = 0
1826 print" [221]
1830 [153]" (NULL)ortantaninc $01 adr = adr + 1
1835 print" [221][221][176]_bne $.. = 0 ?
1840 [153]" (NULL)(NULL)(NULL) inc $02
1845 print" [176][221][221][221]_bmi $.. ende ?
1846 [153]" (NULL)(NULL)(NULL)(NULL)
1850 print" [221][221][221][173][192]lda ($01),y y = 0
1855 [153]" (NULL)(NULL)/tan_bne $.. = 0 ?
1856 print" [221][221]
1860 [153]" (NULL)(NULL) iny y = 1
1865 print" [221][221] lda ($01),y
1870 [153]" (NULL)-tantan_bne $.. = 0 ?
1875 print" [221][221] iny y = 2
1880 [153]" (NULL)(NULL) lda ($01),y
1885 print" [221][173][192][192]_bne $.. = 0 ?
1900 [153]" /tantantantanrts ende
1910 i=9:gosub5000:ifflthen1600
2000 print"[147]nun ein kleiner probelauf! wir rufen
2005 [153]"die routine mit sys 826 auf und drucken
2010 print"dann die in $01/02 stehende adresse de-
2020 [153]"zimal aus: adr = peek(1) + 256*peek(2).
2040 print"damit sie ein gefuehl bekommen, wie fix
2050 [153]"das geht, lassen wir den cbm waehrend
2055 print"dem suchen einen weissen balken auf den
2060 [153]"bildschirm setzen.
2070 print"sind sie bereit (j/n) ?
2090 [161]x$:[139]x$[179][177]"j"[167]2090
2100 [129]c[178]0[164]10:[129]w[178]0[164]400[172][180](c):[130]w:[153]"on cmdcmdcmd";10[171]c:[130]c
2110 [153]"on wait":[158]826:[153]"onadr =";[194](1)[170]256[172][194](2);" "
2120 [153]"schnell, nicht wahr ?!
2130 i=10:gosub5000:ifflthen1800
2200 print"[147]eine erste nutzanwendung fuer dieses
2220 [153]"programm ist die berechnung der laenge
2230 print"von basic-programmen.ein basic-programm
2240 [153]"beginnt stets bei $0400=1024 und endet
2250 print"mit eben dem speicher, wo die drei
2260 [153]"nullen beginnen.
2270 print"wir wuerden also schreiben:
2280 [153]" 1. 'sys 826'":[153]" 2. 'print peek(1)+256*peek(2)-1024'
2290 print"und erhielten als ergebnis die laenge
2295 [153]"des basic-programmes in byte.
2310 i=11:gosub5000:ifflthen2000
2400 print"[147]aufgaben :":printu$
2410 print"1. berechnen sie auf diese weise die
2420 [153]" laenge dieses programms.
2430 print"2. fre(0) beruecksichtigt auch den fuer
2440 [153]" variablen benoetigten speicherplatz.
2445 print" mit diesem maschinenprogramm und
2450 [153]" fre(0) koennen sie den fuer variable
2460 print" benutzten speicherplatz bestimmen.
2470 [153]"3. versuchen sie mit hilfe der internen
2480 print" uhr herauszufinden, wie schnell das
2490 [153]" programm ist [kbyte pro sekunde].
2510 i=12:gosub5000:ifflthen2200
2600 print"[147]4. warum wird als startadresse $03ff
2610 [153]" und nicht $0400 gewaehlt ?
2620 print"5. wann wird der speicher $02 um 1 er-
2630 [153]" hoeht ?
2640 print"6. bei welcher [160]adresse genau erfolgt
2650 [153]" spaetestens der abbruch des suchens?
2660 print"7. warum laesst sich als zaehler[160]nicht
2670 [153]" einfach das xr oder yr verwenden ?
2680 print"8. die innerste schleife beginnt bei
2690 [153]" 'inc $01', die beiden aeusseren bei
2700 print" 'ldy #$00'. warum das ?
2710 [153]"- seite 13 - <+> ontotototocmdcmdcmdcmdendewait <-> von vorne"
3060 [141]5020:[145]fl[137]0
3070 [153]"load":[128]
5000 [143] umblaettern
5010 [153]" - seite";i;"- <+> weiter <-> zurueck";
5020 [129]i[178]0[164]11:[161]x$:[130]
5030 [161]x$:[139]x$[178]""[167]5030
5040 [139]x$[178]"+"[167]fl[178]0:[142]
5050 [139]x$[178]"-"[167]fl[178]1:[142]
5060 [137]5030